<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  1.bind重写与应用;注意偏函数的特性和原型问题

  2.偏函数 与 bind的应用
  偏函数：先固化一部分参数，再按条件执行



  <script>
    // 打印10 call没有生效 需要从bind源码上分析
    /* 
    function test() {
      console.log(this.a);
    }

    test.bind({
      a: 10
    }).call({
      a: 2
    })
 */

    // bind源码重写

    Function.prototype.bind = function () {
      var fn = this,
        _this = arguments[0],
        args = Array.prototype.slice.call(arguments, 1)

      return function () {
        // 原因在于这没有绑定call的this
        return fn.apply(_this, args.concat(Array.prototype.slice.call(arguments)))
      }
    }

    // 练习题
    // bind对丢弃call apply this指向
    /* 
    function foo() {
      return () => {
        return () => {
          return () => {
            console.log('id:', this.id);
          }
        }
      }
    }
    // 1
    var f = foo.call({
      id: 1
    });
    // 1
    var t1 = f.call({
      id: 2
    })()();
    // 1
    var t2 = f().apply({
      id: 3
    })();
    // 1
    var t3 = f()().bind({
      id: 4
    })();
 */

    // 偏函数应用场景1
    var isType = function(type) {
      return function(obj) {
        return (
          Object.prototype.toString.call(obj) === "[object " + type + "]"
        )
      }
    }

    var isString = isType('String')
    var isNumber = isType('Number')
    var isFunction = isType('Function')
    
    console.log(isString(''));
    console.log(isNumber(1));
    console.log(isFunction(function(){}));







  </script>
</body>

</html>